/*
 * 第 9 题
 * 请用代码写出你能想到的数组去重的所有方案
 */
function distinct1(array) {
    for (let i = 0; i < array.length; i++) {
        for (let j = i + 1; j < array.length - i; j++) {
            if (array[i] === array[j]) {
                array.splice(j, 1); // 删除重复元素
            }
        }
    }
    return array;
}

function distinct2(array) {
    // 用一个新数组存储当前元素
    let newArray = [];
    for (let i = 0; i < array.length; i++) {
        if (newArray.indexOf(array[i]) === -1) {
            newArray.push(array[i]);
        }
    }
    return newArray;
}

function distinct3(array) {
    // 使用 Set
    return Array.from(new Set(array));
}

function distinct4(array) {
    // 使用哈希表
    let map = new Map();
    for (let i = 0; i < array.length; i++) {
        if (!map.has(array[i])) {
            map.set(array[i], 1);
        }
    }
    return Array.from(map.keys());
}

function distinct5(array) {
    // 一句话版本哈希表去重
    let map = new Map();
    return array.filter(item => !map.has(item) && map.set(item, true));
}

// console.log(distinct4([1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,]))

/*
 * 第 10 题
 * 请写一段程序，使其可以计算出1-100内所有奇数的总和
 */

function sumOddNumbers() {
    let sum = 0;
    for (let i = 1; i <= 100; i += 2) {
        sum += i;
    }
    return sum;
}

/*
 * 第 12 题
 * 用代码写出防抖和节流
 */

function debounce(fn, delay) {
    // 闭包版本
    let timer = null;
    return function () {
        clearTimeout(timer);
        timer = setTimeout(() => {
            fn();
        }, delay)
    }
}

function throttle(fn, delay, flag) {
    // 闭包版本
    let timer = null;
    return function () {
        if (flag) {
            flag = false;
            timer = setTimeout(() => {
                fn();
                flag = true;
            }, delay)
        }
    }
}


/*
    第14题
    封装一个函数，使其传入任意一段纯字母的字符串，都能返回这段字符串中出现频率最高的那个字母，并且忽略大小写，比如”Aa”这就算a出现了两次
 */

function getMaxChar(str) {
    // 创建一个对象，记录字母出现的次数
    let charMap = new Map();
    let char = ""
    let maxChar = '';
    let maxCount = 0;

    for (char of str) {

        if (charMap.has(char)) {
            charMap.set(char, charMap.get(char) + 1);
        } else {
            charMap.set(char, 1);
        }
    }


    for (let [char, count] of charMap.entries()) {
        if (count > maxCount) {
            maxChar = char;
            maxCount = count;
        }
    }
    return {char: maxChar, count: maxCount};
}

/*
 * 第 16 题
 * 传入任意两个日期字符串，可以返回两个日期之间相差几天
 */
function getDaysBetweenDates(date1, date2) {
    let dateObj1 = new Date(date1);
    let dateObj2 = new Date(date2);
    return Math.abs(dateObj1 - dateObj2) / (1000 * 60 * 60 * 24);
}

/*
 * 第 17 题
 * 17.传入任意key=value&key=value2形式的字符串，可以返回对象格式的数据，
 * 比如传入 key=value&key=value2字符串，返回{key:value,key2:value2},
 * 传入"key1=value1&key2=value2&key3=value3"，返回{ key1: 'value1', key2: 'value2', key3: 'value3' }
 */

function parseQueryString(str) {
    let obj = {};
    str.split('&').forEach(item => {
        let [key, value] = item.split('=');
        obj[key] = value;
    });
    return obj;
}

